//
// Created by Lenovo on 2017/12/21.
//
#include <jni.h>
#include <malloc.h>
#include <string.h>

JNIEXPORT jstring JNICALL
Java_com_calm_ndkstu_MainActivity_syaHelloworld(JNIEnv *env, jobject instance) {

    // TODO
    return (*env)->NewStringUTF(env, "Hello World !");
}
/**
 * java String转化为C String
 * @param env
 * @param jstr
 * @return
 */
char * Jstring2CStr(JNIEnv* env,jstring jstr)
{
    char * rtn = NULL;
    jclass classstring = (*env)->FindClass(env,"java/lang/String"); //获取String类
    jstring strencode = (*env)->NewStringUTF(env,"UTF-8");//获取编码方式
    /*jmethodID GetMethodID(JNIEnv *env, jclass clazz,const char *name, const char *sig);  获取一个Java方法的ID
    这个函数将返回非静态类或接口实例方法的方法 ID。这个方法可以是某个clazz 的超类中定义，
     也可从clazz 继承，最后一个参数为签名，最后两个参数是const char*类型，是utf8类型。
     需要注意的是执行GetMethodID()函数将导致未初始化的类初始化，如果要获得构造函数的方法ID，使用 <init> 作为方法名，
     同时将 void (V) 作为返回类型，如果找不到指定的ID将返回NULL，同时异常可能有:
    (1  NoSuchMethodError 找不到指定的Java方法。
    (2  ExceptionInInitializerError 如果由于异常而导致类初始化程序失败
    (3  OutOfMemoryError 内存不足*/
    /**
     * 最后一个参数为签名  ()里为参数  基本类型(I) 引用类型 L开头;结尾
     * [B返回 表示Byte[] 二维则[[B
     */
    jmethodID mid = (*env)->GetMethodID(env,classstring,"getBytes","(Ljava/lang/String;)[B");//查找String.getBytes()方法
    jbyteArray  barr = (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
    jsize alen = (*env)->GetArrayLength(env,barr);
    jbyte * ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
    if(alen > 0)
    {
        rtn = (char*)malloc(alen+1);
        memcpy(rtn,ba,alen);
        rtn[alen] = 0;
    }
    (*env)->ReleaseByteArrayElements(env,barr,ba,0);
    return rtn;
}
JNIEXPORT jstring JNICALL
Java_com_calm_ndkstu_MainActivity_sayHello(JNIEnv *env, jobject instance, jstring name_,jstring say_) {
    char * cStr = Jstring2CStr(env,name_);
    char * addStr = Jstring2CStr(env,say_);
    strcat(cStr,addStr);
    return (*env)->NewStringUTF(env, cStr);
}

JNIEXPORT jint JNICALL
Java_com_calm_ndkstu_MainActivity_getIntArrSum(JNIEnv *env, jobject instance, jintArray arr_) {
    jint *arr = (*env)->GetIntArrayElements(env, arr_, NULL);

    // TODO
    jint len = (*env)->GetArrayLength(env,arr_);
    int i = 0;
    int sum = 0;
    for(;i < len;i++)
    {
        sum+=arr[i];
    }
    (*env)->ReleaseIntArrayElements(env, arr_, arr, 0);
    return sum;
}